extends Node3D

@export var debug弹痕:PackedScene
@export var 投射物过期销毁时间:int = 10
@export var 是否显示debug弹痕:bool = false
var 武器射弹速度:int

var 喷射向量 
var 弹片点数 :int = 8 
var 生成范围 :Vector2 = Vector2(100, 100) # 在 X 和 Y 轴上的范围
var 补偿: int


var 伤害:int = 0
var 射弹列表 = []

func _ready() -> void:
	get_tree().create_timer(投射物过期销毁时间).timeout.connect(时间结束)

func 时间结束():
	queue_free()


func 设置投射物(_武器射弹速度,武器射弹类型,_机瞄补偿:int,_弹片数量:int,_伤害:int = 0,_扩散:float=0.0,_射程:int = 2000,):
	伤害 = _伤害
	武器射弹速度 = _武器射弹速度
	randomize()
	for i in range(_弹片数量):
		var x轴扩散 = randfn(0,_扩散)
		var y轴扩散 = randfn(0,_扩散)
		发射投射物(Vector2(x轴扩散,y轴扩散),_射程,武器射弹类型)




func 发射投射物(_扩散,_射程,_武器射弹类型):
	var _相机视线 = 获取相机视线(_扩散,_射程)
	击中扫描(_相机视线,_射程)
	


func 获取相机视线(扩散:Vector2=Vector2.ZERO,射程=2000):
	var 相机 = get_viewport().get_camera_3d()
	var 视口 = get_viewport().get_size()
	var 射线起点 = 相机.project_ray_origin(视口/2)
	var 射线终点 = (射线起点 + 相机.project_ray_normal((视口/2) - Vector2i(扩散)) * 射程)
	
	var 新射线交汇点 = PhysicsRayQueryParameters3D.create(射线起点,射线终点)
	新射线交汇点.collide_with_bodies = true
	新射线交汇点.collision_mask = 1
	var 射线交汇点 = get_world_3d().direct_space_state.intersect_ray(新射线交汇点)
	if not 射线交汇点.is_empty()  :
		var 碰撞点 = [射线交汇点.collider,射线交汇点.position]
		return 碰撞点
	else :
		return [null,射线终点]
	

func 击中扫描(_相机碰撞点:Array,_射程:int):
	var 碰撞点 = _相机碰撞点[1]
	var 枪口射线检测器 = get_parent()
	if _相机碰撞点[0]:
		加载debug弹痕(碰撞点)
		if _相机碰撞点[0].is_in_group("可攻击目标"):
			var 世界 = get_world_3d().direct_space_state
			var 子弹碰撞点 = ( 碰撞点 - 枪口射线检测器.get_global_transform().origin).normalized()
			var 新射线交汇点 = PhysicsRayQueryParameters3D.create(枪口射线检测器.get_global_transform().origin,碰撞点+子弹碰撞点*2)
			var 子弹交汇点 = 世界.intersect_ray(新射线交汇点)
			命中反馈(子弹交汇点.collider,子弹碰撞点,子弹交汇点.position,伤害)



func 命中反馈(命中目标,_击中向量,_击中动量,_伤害):
	if 命中目标.is_in_group("可攻击目标") and 命中目标.has_method("击中反馈"):
		命中目标.击中反馈(_伤害,_击中向量,_击中动量)



func 弹丸碰撞(body,射弹):
	if body.is_in_group("可攻击目标") and body.has_method("击中反馈"):
		body.击中反馈(伤害)
	加载debug弹痕(射弹.get_position())
	射弹列表.erase(射弹)
	if 射弹列表.is_empty():
		queue_free()


func 加载debug弹痕(_位置):
	var 生成痕迹 = debug弹痕.instantiate()
	var _世界 = get_tree().get_root().get_child(0)
	if 是否显示debug弹痕 == true:
		_世界.add_child(生成痕迹)
		生成痕迹.position = _位置
